#ifndef		__DRV_SPI_BIT__H
#define		__DRV_SPI_BIT__H
#include "at32f403a_407_conf.h"
#include <spi-bit-ops.h>
#include "drv_common.h"


#define		SPI_NUM			4


struct spi_port
{
    gpio_type 	*gpio_x;
    rt_base_t 	gpio_pin;
};

struct spi_data
{
		struct spi_port		sclk;
		struct spi_port		mosi;
		struct spi_port		sysnc;	
}spi_datas[SPI_NUM] = {
		[0] = {GPIOA,GPIO_PINS_5,		GPIOA,GPIO_PINS_6, 	GPIOA,GPIO_PINS_4, },
		[1] = {GPIOB,GPIO_PINS_13,	GPIOB,GPIO_PINS_14,	GPIOB,GPIO_PINS_12,},
		[2] = {GPIOB,GPIO_PINS_3,		GPIOB,GPIO_PINS_4, 	GPIOA,GPIO_PINS_15,},
		[3] = {GPIOB,GPIO_PINS_7,		GPIOB,GPIO_PINS_8, 	GPIOB,GPIO_PINS_6, },		
};


struct rt_spi_configuration config = {
		.data_width = 16,
		.mode 			= RT_SPI_MASTER | RT_SPI_MSB | RT_SPI_MODE_0,
		.max_hz     = 1 * 1000 * 1000,
};

void set_sclk(void *data, rt_int32_t state)
{
		struct spi_data		*pd = (struct spi_data	*)data;
		state ? gpio_bits_set(pd->sclk.gpio_x,pd->sclk.gpio_pin) : gpio_bits_reset(pd->sclk.gpio_x,pd->sclk.gpio_pin);		
}

void set_mosi(void *data, rt_int32_t state)
{
		struct spi_data		*pd = (struct spi_data	*)data;
		state ? gpio_bits_set(pd->mosi.gpio_x,pd->mosi.gpio_pin) : gpio_bits_reset(pd->mosi.gpio_x,pd->mosi.gpio_pin);
}

void set_miso(void *data, rt_int32_t state)
{
	
}

rt_int32_t bit2bitno(rt_uint32_t bit)
{
    int i;
    for (i = 0; i < 32; i++)
    {
        if ((0x01 << i) == bit)
        {
            return i;
        }
    }
    return -1;
}

void dir_mosi(void *data, rt_int32_t state)
{
		struct spi_data		*pd = (struct spi_data	*)data;
		
		rt_base_t  idx = bit2bitno(pd->mosi.gpio_pin);
		RT_ASSERT( 0 < idx);
		rt_base_t  pin = ((((rt_base_t)(pd->mosi.gpio_x))	- (rt_base_t)GPIOA_BASE)/(0x0400UL))*16 + idx;
		state ? rt_pin_mode(pin,PIN_MODE_INPUT) : rt_pin_mode(pin,PIN_MODE_OUTPUT);
}

void tog_sclk(void *data)
{
		struct spi_data		*pd = (struct spi_data	*)data;
	
		gpio_output_data_bit_read(pd->sclk.gpio_x,pd->sclk.gpio_pin) ? gpio_bits_reset(pd->sclk.gpio_x,pd->sclk.gpio_pin) :\
																																	gpio_bits_set(pd->sclk.gpio_x,pd->sclk.gpio_pin);
}


struct rt_spi_bit_ops		_ops={
		.data = &spi_datas,
		.tog_sclk = tog_sclk,
		.set_sclk = set_sclk,
		.set_mosi = set_mosi,
		.set_miso = set_miso,
		.dir_mosi = dir_mosi,
		.udelay 	= rt_hw_us_delay,
		.delay_us	= 0,
};









#endif


